import router from './router' // 引入自己封装的router(相当于this.$router)
import store from './store' // 引入了自己封装的store(相当于this.$store)
import {
  Message
} from 'element-ui' // elementUI提示
import NProgress from 'nprogress' // progress bar
// 如果想看包的作用 最好去npmjs.com网站去查看 路由切换 应用程序的细长进度条
import 'nprogress/nprogress.css' // progress bar style  //进度条的样式
import {
  getToken // 自己 封装的获得token方法
} from '@/utils/auth' // get token from cookie
import getPageTitle from '@/utils/get-page-title' // 导入标题文字拼接

// 分析代码思路:
// 1.先找官方文档读一读
// 2.自己改一改试一试分析分析
// 3.百度或者问别人
// 4.不影响核心逻辑,放一放
NProgress.configure({
  showSpinner: false // 设置右侧进度环
}) // NProgress Configuration

const whiteList = ['/login'] // no redirect whitelist //白名单
// 全局路由前置守卫
// to:要去的下一个路由的规则对象
router.beforeEach(async(to, from, next) => {
  // start progress bar
  NProgress.start() // 进度条开始启动

  // set page title
  // 改变标题的文字和index.html的title标签差不多
  // document.title 可以在js 中动态改变 标签为静态的
  document.title = getPageTitle(to.meta.title) // 设置对应的标签栏的标题文字
  // to.meta.title拿到手的是,路由规则对象中提前存放好的标题文字
  // determine whether the user has logged in
  const hasToken = getToken() // 获得token

  if (hasToken) {
    if (to.path === '/login') {
      // if is logged in, redirect to the home page
      next({ // 已经成功登陆了 有token了 还想去login页 拦住 返回到首页
        path: '/'
      })
      NProgress.done() // 进度条结束
    } else { // 已登录,不去登录页
      const hasGetUserInfo = store.getters.name // 获取用户名
      if (hasGetUserInfo) { // 有用户名
        next() // 放行
      } else { // 没有用户名
        try {
          // get user info
          await store.dispatch('user/getInfo') // 已经登录有token 没有用户信息 调用actions拿用户信息
          // 等待网络请求,放行到下一个页面
          next()
        } catch (error) { // 出错误 可能token过期了
          // remove token and go to login page to re-login
          await store.dispatch('user/resetToken') // 清除token
          Message.error(error || 'Has Error') // 给用户一个提示
          next(`/login?redirect=${to.path}`)
          // 打回到登录页(token过期,回去重新登录)
          // 给登录页面进行路由跳转传参(把本来要去的页面to.path地址传给登录页)
          // 登录后不会去首页,而是直接去到刚才没成功过去的那个未遂页面上
          NProgress.done()// 进度条结束
        }
      }
    }
  } else { // 没有token
    /* has no token*/
    // 取得页面时否是白名单中的
    if (whiteList.indexOf(to.path) !== -1) {
      // includes 判断存在返回true
      // in the free login whitelist, go directly
      next() // 在名单里的放行
    } else {
      // 不再白名单里的
      // other pages that do not have permission to access are redirected to the login page.
      // next()里有路径,就会再次发生一次路由跳转,路由守卫会从头再重新执行一遍
      next(`/login?redirect=${to.path}`)// 跳转登录页并记录要去的页面
      NProgress.done() // 进度条结束
    }
  }
})
// 全局路由-后置守卫(路由跳转完成,再触发()里函数体)
router.afterEach(() => {
  // finish progress bar
  NProgress.done() // 进度条关闭
})
